package org.lxg.spring.demo;

import org.lxg.spring.config.autobean.AutoBeanConfig;
import org.lxg.spring.service.SpringJdbcTemplateDemoService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;
import java.sql.SQLException;


public class SpringJdbcTemplateDemo {

    public static void main(String[] args) throws SQLException {

        /**
         *  通过 xml 进行 Spring jdbc 及 事务控制
         *  开启事务：
         *
         *   <!-- 配置一个事务管理器 -->
         *     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
         *         <!-- 注入DataSource -->
         *         <property name="dataSource" ref="dataSource"></property>
         *     </bean>
         *
         *     <!-- 采用@Transactional注解方式使用事务  -->
         *     <tx:annotation-driven transaction-manager="txManager"/>
         *
         *   使用
         *    @Transactional(rollbackFor = Exception.class) 控制事务
         */

        ApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml");
        JdbcTemplate jdbcTemplate = (JdbcTemplate) application.getBean("jdbcTemplate");
        DataSource dataSource = application.getBean(DataSource.class);
        System.out.println("连接成功" + dataSource.getConnection());
        SpringJdbcTemplateDemoService jdbcService = (SpringJdbcTemplateDemoService) application.getBean("jdbcService");
        jdbcService.testUpdate(jdbcTemplate);


        /**
         *  通过自动装配bean的方式 注入 DataSource 及 事务控制
         *  开启事务：
         *  @EnableTransactionManagement 等同于xml配置方式的 <tx:annotation-driven />
         *
         *  使用
         *  @Transactional(rollbackFor = Exception.class) 控制事务
         */

        ApplicationContext contextAutoConfig = new AnnotationConfigApplicationContext(AutoBeanConfig.class);
        DataSource dataSource1 = contextAutoConfig.getBean(DataSource.class);
        JdbcTemplate jdbcTemplate1 = contextAutoConfig.getBean(JdbcTemplate.class);
        System.out.println("连接成功" + dataSource1.getConnection());
        SpringJdbcTemplateDemoService jdbcService1 = contextAutoConfig.getBean(SpringJdbcTemplateDemoService.class);
        jdbcService1.testInsert(jdbcTemplate1);

        /**
         *   坑 ： 事务控制没有生效
         *  原因： 调用事务的service 方法 不是由 Spring 控制生产 代理， 所有无法使用 AOP
         */

    }


}